package sample;

public class LinkListClass<E>{
    LinkNode<E> head;
    public LinkListClass(){
        head= new LinkNode<>();
        head.next = null;
    }
    // 头插法
    public void CreateList_head(E[] a){
        LinkNode<E> s;
        for(int i=0;i<a.length;i++){
            s = new LinkNode<>(a[i]);
            s.next = head.next;
            head.next = s;
        }

    }
    // 尾插法
    public void CreateListR(E[] a){
        LinkNode<E> s,t;
        t=head;
        for(int i=0;i<a.length;i++){
            s = new LinkNode<>(a[i]);
            t.next = s;
            t =s;
        }
        t.next = null;
    }
    // 添加数据为e的节点在后面
    public void Add(E e){
        LinkNode<E> s = new LinkNode<>(e);
        LinkNode<E> p;
        p=head;
        while(p.next!=null){
            p = p.next;
        }
        p.next = s;
    }
    // 求单链表的有数据节点的个数/长度
    public int size(){
        LinkNode<E> p;
        p=head;
        int numbers=0;
        while (p.next!=null){
            numbers+=1;
            p = p.next;
        }
        return numbers;
    }
    // 获取序号为i的数据节点
    public LinkNode<E> geti(int i){
        LinkNode<E> p;
        p=head;
        int j=-1;
        while(j<i){
            j++;
            p = p.next;
        }
        return p;
    }
    // 找到线性表为i的数据节点的数据
    public E GetElem(int i){
        int len = size();
        if(i<0||i>len-1){
            throw new IllegalArgumentException("超出范围");
        }
        LinkNode<E> p = geti(i);
        return p.data;
    }
    // 设置线性表序号为i的数据
    public void SetElem(int i,E e){
        LinkNode<E> p = geti(i);
        p.data = e;
    }
    // 求线性表中第一个值为e的元素的序号
    public int GetNo(E e){
        LinkNode<E>p;
        p=head.next;
        int i=0;
        while (p!=null&&p.data!=e){
            i++;

            p = p.next;
        }
        if(p==null) {
            return -1;
        };
        return i;
    }
    // 将线性表中序号为i和j的数据交换
    public void swap(int i,int j){
        LinkNode<E>p=geti(i);
        LinkNode<E>q = geti(j);
        E tmp = p.data;
        p.data = q.data;
        q.data = tmp;
    }
    // 在线性表中i位置，插入数据为e的节点
    public void Insert(int i,E e){
        LinkNode<E>p = new LinkNode<>(e);
        LinkNode<E>s = geti(i-1);
        p.next = s.next;
        s.next = p;
    }
    // 在线性表中删除第i个节点
    public void Delete(int i){
        if(i<0||i>size()-1){
            throw new IllegalArgumentException("超出范围了");
        }
        LinkNode<E> p = geti(i-1);
        p.next = p.next.next;
    }
    // 将线性表中的元素转换为字符串
    public String toString(){
        String str = "";
        LinkNode<E>p;
        p = head.next;
        while (p!=null){
            str+=p.data+" ";
            p = p.next;
        }
        return str;
    }



}
class LinkNode<T>{
    // 节点存储的数据
    T data;
    LinkNode<T> next;
    // 初始化1
    public LinkNode(){
        next = null;
    }
    // 初始化2
    public LinkNode(T e){
        data = e;
        next = null;
    }
}